package com.ada.common.widget;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

/**
 * createTime: 08/06/2017 22:26
 * descripe:自带清除按钮的edittext，清除按钮通过设置drawableRight来设置
 */

public class ClearEditText extends EditText implements View.OnFocusChangeListener, TextWatcher {

	private Drawable mClearDrawable;
	private boolean hasFocus;

	public ClearEditText(Context context) {
		this(context, null);
	}

	public ClearEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	private void init() {
		// getCompoundDrawables() Returns drawables for the left(0), top(1), right(2) and bottom(3)
		mClearDrawable = getCompoundDrawables()[2]; // 获取drawableRight
		if (mClearDrawable != null) {
			mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
		}
		setOnFocusChangeListener(this);
		addTextChangedListener(this);
		// 默认隐藏图标
		setDrawableVisible(false);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_UP) {
			if (getCompoundDrawables()[2] != null) {
				int start = getWidth() - getTotalPaddingRight() + getPaddingRight();
				int end = getWidth();
				boolean available = (event.getX() > start) && (event.getX() < end);
				if (available) {
					this.setText("");
				}
			}
		}
		return super.onTouchEvent(event);
	}

	@Override
	public void onFocusChange(View v, boolean hasFocus) {
		this.hasFocus = hasFocus;
		if (hasFocus && getText().length() > 0) {
			setDrawableVisible(true);
		} else {
			setDrawableVisible(false);
		}
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int count, int after) {
		if (hasFocus) {
			setDrawableVisible(s.length() > 0);
		}
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
	}

	@Override
	public void afterTextChanged(Editable s) {
	}

	protected void setDrawableVisible(boolean visible) {
		Drawable right = !mIsForceHide && visible ? mClearDrawable : null;
		setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
	}

	private boolean mIsForceHide = false;
	public void setForceHide(){
		mIsForceHide = true;
	}
}